import pandas as pd
import matplotlib.pyplot as plt
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
from openpyxl.utils.cell import column_index_from_string, get_column_letter

# 文件路径
file_path = r'D:\examq\student_data.xlsx'

# 读取工作表中的数据
df = pd.read_excel(file_path, sheet_name='正确率汇总')  # 假设数据在“正确率汇总”工作表中

# 筛选正确率和错误率的数据
correct_rate = df.iloc[0:12, 2]  # 假设正确率在 C 列
error_rate = df.iloc[0:12, 3]   # 假设错误率在 D 列

# 检查数据长度
print(f"正确率数据长度: {len(correct_rate)}")
print(f"错误率数据长度: {len(error_rate)}")

# 定义图片的起始位置和间隔
start_row = 2  # 从第 2 行开始
start_col = 'B'  # 从 B 列开始
col_interval = 7  # 列间隔
row_interval = 25  # 行间隔
items_per_row = 5  # 每行放置5个图片

# 加载原始 Excel 文件
wb = load_workbook(file_path)

# 检查是否存在名为“pic”的工作表，如果不存在则创建
if 'pic' not in wb.sheetnames:
    wb.create_sheet('pic')
    wb.save(file_path)  # 保存工作簿以确保新工作表被创建

# 重新加载工作簿以确保新工作表被正确加载
wb = load_workbook(file_path)
ws = wb['pic']  # 选择“pic”工作表

# 为每个数据生成饼状图并嵌入到 Excel
for i in range(len(correct_rate)):
    print(f"处理第 {i + 1} 个图片...")
    try:
        # 创建饼状图
        fig, ax = plt.subplots()
        ax.pie([correct_rate.iloc[i], error_rate.iloc[i]], 
               labels=['正确率', '错误率'], 
               autopct='%1.1f%%', 
               startangle=90,
               textprops={'fontsize': 28})  # 将字体大小调整为原来的3倍
        ax.axis('equal')  # 确保饼状图是圆形
        plt.title(f'题号 {i + 1}', fontsize=28)  # 设置标题字体大小为原来的3倍

        # 保存饼状图为图片
        img_path = f'tmp_chart_{i + 1}.png'
        plt.savefig(img_path, bbox_inches='tight')  # 保存图片，确保紧凑
        plt.close(fig)

        # 计算图片的插入位置
        row = start_row + (i // items_per_row) * row_interval  # 计算行号
        start_col_num = column_index_from_string(start_col)  # 将起始列转换为数字
        col_num = start_col_num + (i % items_per_row) * col_interval  # 计算列号
        col = get_column_letter(col_num)  # 将数字转换回字母

        # 将图片嵌入到 Excel
        img = Image(img_path)
        img.width = img.width  # 不缩放图片
        img.height = img.height
        ws.add_image(img, f'{col}{row}')  # 插入图片

    except Exception as e:
        print(f"生成第 {i + 1} 个图片时出错: {e}")

# 保存工作簿
wb.save(file_path)
wb.close()

print("饼状图已嵌入到原始 Excel 文件的第四个工作表（pic）中。")